home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / C⁄C++ / Kant Generator Pro 1.2 / src / Shell ƒ / offscreen layer.c < prev    next >
C/C++ Source or Header  |  1995-02-14  |  8KB  |  256 lines

  1. #include "offscreen layer.h"
  2. #include "window layer.h"
  3. #include "graphics.h"
  4. #include "timing.h"
  5.  
  6. extern    Boolean            gHasColorQD;    /* see environment.c */
  7.  
  8. MyOffscreenComboPtr AllocateOffscreenCombo(WindowPtr theWindow, Rect *sourceRect, Rect *destRect,
  9.     short scrollSpeed, Handle theText, short font, short size)
  10. /* leaks memory on error */
  11. {
  12.     OSErr            oe;
  13.     MyOffscreenComboPtr    offscreenComboPtr;
  14.     Rect            scrollSourceRect, scrollDestRect;
  15.     Boolean            dummy;
  16.     
  17.     offscreenComboPtr=(MyOffscreenComboPtr)NewPtr(sizeof(MyOffscreenComboRec));
  18.     offscreenComboPtr->sourceRect=*sourceRect;
  19.     offscreenComboPtr->destRect=*destRect;
  20.     offscreenComboPtr->destWindow=theWindow;
  21.     if ((oe=AllocatePartialOffscreenWorld(theWindow, &(offscreenComboPtr->offscreenWorldRec),
  22.         sourceRect, FALSE, &dummy))!=noErr)
  23.         return 0L;
  24.     if ((oe=AllocatePartialOffscreenWorld(theWindow, &(offscreenComboPtr->patternWorldRec),
  25.         sourceRect, FALSE, &dummy))!=noErr)
  26.         return 0L;
  27.     if ((oe=AllocatePartialOffscreenWorld(theWindow, &(offscreenComboPtr->scratchWorldRec),
  28.         sourceRect, FALSE, &dummy))!=noErr)
  29.         return 0L;
  30.     if ((scrollSpeed!=0) && (theText!=0L))
  31.     {
  32.         offscreenComboPtr->scrollSpeed=scrollSpeed;
  33.         offscreenComboPtr->theText=theText;
  34.         scrollSourceRect=*sourceRect;
  35.         scrollSourceRect.left+=scrollSpeed;
  36.         scrollDestRect=*sourceRect;
  37.         scrollDestRect.right-=scrollSpeed;
  38.         offscreenComboPtr->scrollSourceRect=scrollSourceRect;
  39.         offscreenComboPtr->scrollDestRect=scrollDestRect;
  40.         offscreenComboPtr->scrollXPos=sourceRect->right-sourceRect->left-1;
  41.         offscreenComboPtr->font=font;
  42.         offscreenComboPtr->size=size;
  43.         offscreenComboPtr->offset=0L;
  44.     }
  45.     else
  46.     {
  47.         offscreenComboPtr->scrollSpeed=0;
  48.         offscreenComboPtr->theText=0L;
  49.     }
  50.     
  51.     return offscreenComboPtr;
  52. }
  53.  
  54. OSErr AllocatePartialOffscreenWorld(WindowPtr theWindow, MyOffscreenPtr offscreenWorldPtr,
  55.     Rect *boundsRect, Boolean setPort, Boolean *depthChanged)
  56. {
  57.     long            offRowBytes, sizeOfOff;
  58.     PixMapHandle    thePixMapHandle;
  59.     GWorldPtr        theGWorld;
  60.     Ptr                bwBitMap;
  61.     GrafPort        bwGrafPort;
  62.     GrafPtr            bwGrafPtr;
  63.     OSErr            memError;
  64.     short            realWindowDepth, maxWindowDepth;
  65.     
  66.     maxWindowDepth=GetWindowMaxDepth(theWindow);
  67.     realWindowDepth=GetWindowRealDepth(theWindow);
  68. //    OffsetRect(boundsRect, -boundsRect->left, -boundsRect->top);
  69.     
  70.     *depthChanged=FALSE;
  71.     if (gHasColorQD)    /* w/o Color Quickdraw, GWorlds may not be supported */
  72.     {
  73.         /* try to create new graphics world; display error if unsuccessful */
  74.         if (NewGWorld(&theGWorld, (realWindowDepth>=maxWindowDepth) ? maxWindowDepth : 0,
  75.                 boundsRect, 0L, 0L, 0)!=0)
  76.         {
  77.             return MemError();
  78.         }
  79.         
  80.         NoPurgePixels(GetGWorldPixMap(theGWorld));    /* never purge our pixmap! */
  81.         
  82.         GetGWorld(&(offscreenWorldPtr->currentGWorld),
  83.             &(offscreenWorldPtr->currentGDHandle));    /* get current settings */
  84.         LockPixels(thePixMapHandle=GetGWorldPixMap(theGWorld));    /* important!  copybits may move mem */
  85.         /* update offscreen graphics world, compensating for change in pixel depth */
  86.         UpdateGWorld(&theGWorld, (realWindowDepth>=maxWindowDepth) ? maxWindowDepth : 0,
  87.                 boundsRect, 0L, 0L, 0);
  88.         if (setPort)
  89.             SetGWorld(theGWorld, 0L);                /* set to our offscreen gworld */
  90.         else
  91.             SetGWorld((GWorldPtr)offscreenWorldPtr->currentGWorld, offscreenWorldPtr->currentGDHandle);
  92.         
  93.         offscreenWorldPtr->offscreenPtr=(GrafPtr)theGWorld;
  94.         offscreenWorldPtr->pixMapHandle=thePixMapHandle;
  95.         offscreenWorldPtr->isColor=TRUE;
  96.  
  97.         if (((realWindowDepth>=maxWindowDepth) ? maxWindowDepth : realWindowDepth)!=GetWindowDepth(theWindow))
  98.         {
  99.             *depthChanged=TRUE;
  100.         }
  101.     }
  102.     else    /* deal with (guaranteed) B/W bitmaps manually */
  103.     {
  104.         bwGrafPtr=&bwGrafPort;
  105.         OpenPort(bwGrafPtr);
  106.         offRowBytes=(((boundsRect->right-boundsRect->left)+15)>>4)<<1;
  107.         sizeOfOff=(long)(boundsRect->bottom-boundsRect->top)*offRowBytes;
  108.         bwBitMap=NewPtr(sizeOfOff);
  109.         if (bwBitMap==0L)
  110.         {
  111.             memError=MemError();
  112.             ClosePort(bwGrafPtr);
  113.             return memError;
  114.         }
  115.         
  116.         bwGrafPort.portBits.baseAddr=bwBitMap;
  117.         bwGrafPort.portBits.rowBytes=offRowBytes;
  118.         bwGrafPort.portBits.bounds=bwGrafPort.portRect=*boundsRect;
  119.         
  120.         if (setPort)
  121.             SetPort(bwGrafPtr);
  122.         else
  123.             SetPort(theWindow);
  124.         
  125.         offscreenWorldPtr->offscreenPtr=bwGrafPtr;
  126.         offscreenWorldPtr->bwBitMap=bwBitMap;
  127.         offscreenWorldPtr->bwGrafPort=bwGrafPort;
  128.         offscreenWorldPtr->isColor=FALSE;
  129.     }
  130.     
  131.     return noErr;
  132. }
  133.  
  134. OSErr AllocateOffscreenWorld(WindowPtr theWindow, MyOffscreenPtr offscreenWorldPtr,
  135.     Boolean *depthChanged)
  136. {
  137.     return AllocatePartialOffscreenWorld(theWindow, offscreenWorldPtr, &(theWindow->portRect),
  138.         TRUE, depthChanged);
  139. }
  140.  
  141. void CopybitsCombo(MyOffscreenComboPtr offscreenComboPtr)
  142. {
  143.     Rect            sourceRect, destRect;
  144.     GrafPtr            patternPtr;
  145.     GrafPtr            sourcePtr;
  146.     GrafPtr            comboPtr;
  147.     WindowPtr        destWindow;
  148.     
  149.     sourceRect=offscreenComboPtr->sourceRect;
  150.     destRect=offscreenComboPtr->destRect;
  151.     destWindow=offscreenComboPtr->destWindow;
  152.     sourcePtr=offscreenComboPtr->offscreenWorldRec.offscreenPtr;
  153.     patternPtr=offscreenComboPtr->patternWorldRec.offscreenPtr;
  154.     comboPtr=offscreenComboPtr->scratchWorldRec.offscreenPtr;
  155.  
  156.     CopyBits(&(sourcePtr->portBits), &(comboPtr->portBits), &sourceRect, &sourceRect, srcCopy, 0L);
  157.     CopyBits(&(patternPtr->portBits), &(comboPtr->portBits), &sourceRect, &sourceRect, srcOr, 0L);
  158.     CopyBits(&(comboPtr->portBits), &(destWindow->portBits), &sourceRect, &destRect, srcCopy, 0L);
  159. }
  160.  
  161. void ScrollTextCombo(MyOffscreenComboPtr offscreenComboPtr)
  162. {
  163.     unsigned char    theChar;
  164.     Rect            sourceRect;
  165.     Rect            destRect;
  166.     GrafPtr            patternPtr;
  167.     GrafPtr            sourcePtr;
  168.     GrafPtr            comboPtr;
  169.     WindowPtr        destWindow;
  170.     short            charWidth;
  171.     
  172.     StartTiming();
  173.     
  174.     sourceRect=offscreenComboPtr->sourceRect;
  175.     destRect=offscreenComboPtr->destRect;
  176.     destWindow=offscreenComboPtr->destWindow;
  177.     sourcePtr=offscreenComboPtr->offscreenWorldRec.offscreenPtr;
  178.     patternPtr=offscreenComboPtr->patternWorldRec.offscreenPtr;
  179.     comboPtr=offscreenComboPtr->scratchWorldRec.offscreenPtr;
  180.  
  181.     SetPortToOffscreenWindow(&(offscreenComboPtr->offscreenWorldRec));
  182.     CopyBits(&(sourcePtr->portBits), &(sourcePtr->portBits), &(offscreenComboPtr->scrollSourceRect),
  183.              &(offscreenComboPtr->scrollDestRect), 0, 0L);
  184.     
  185.     MoveTo(sourceRect.left+(offscreenComboPtr->scrollXPos), sourceRect.bottom-3);
  186.     
  187.     theChar=(*(offscreenComboPtr->theText))[offscreenComboPtr->offset];
  188.     TextMode(notSrcCopy);
  189.     TextFont(offscreenComboPtr->font);
  190.     TextSize(offscreenComboPtr->size);
  191.     
  192.     charWidth=CharWidth(theChar);
  193.     DrawChar(theChar);
  194.     
  195.     SetPortToOnscreenWindow(offscreenComboPtr->destWindow, &(offscreenComboPtr->offscreenWorldRec));
  196.     
  197.     CopyBits(&(sourcePtr->portBits), &(comboPtr->portBits), &sourceRect, &sourceRect, srcCopy, 0L);
  198.     CopyBits(&(patternPtr->portBits), &(comboPtr->portBits), &sourceRect, &sourceRect, srcOr, 0L);
  199.     CopyBits(&(comboPtr->portBits), &(destWindow->portBits), &sourceRect, &destRect, srcCopy, 0L);
  200.     
  201.     offscreenComboPtr->scrollXPos-=offscreenComboPtr->scrollSpeed;
  202.     if (offscreenComboPtr->scrollXPos+charWidth<=(sourceRect.right-sourceRect.left-1-offscreenComboPtr->scrollSpeed))
  203.     {
  204.         offscreenComboPtr->scrollXPos+=charWidth;
  205.         if ((++(offscreenComboPtr->offset))==GetHandleSize(offscreenComboPtr->theText))
  206.             offscreenComboPtr->offset=0L;
  207.     }
  208.     TimeCorrection(2);
  209. }
  210.  
  211. void SetPortToOnscreenWindow(WindowPtr theWindow, MyOffscreenPtr offscreenWorldPtr)
  212. {
  213.     if (offscreenWorldPtr->isColor)
  214.     {
  215.         SetGWorld(offscreenWorldPtr->currentGWorld, offscreenWorldPtr->currentGDHandle);
  216.     }
  217.     
  218.     SetPort(theWindow);
  219. }
  220.  
  221. void SetPortToOffscreenWindow(MyOffscreenPtr offscreenWorldPtr)
  222. {
  223.     if (offscreenWorldPtr->isColor)
  224.     {
  225.         SetGWorld((GWorldPtr)offscreenWorldPtr->offscreenPtr, 0L);
  226.     }
  227.     else
  228.     {
  229.         SetPort(offscreenWorldPtr->offscreenPtr);
  230.     }
  231. }
  232.  
  233. void DisposeOffscreenWorld(MyOffscreenPtr offscreenWorldPtr)
  234. {
  235.     if (offscreenWorldPtr->isColor)
  236.     {
  237.         UnlockPixels(offscreenWorldPtr->pixMapHandle);
  238.         DisposeGWorld((GWorldPtr)(offscreenWorldPtr->offscreenPtr));
  239.     }
  240.     else
  241.     {
  242.         ClosePort(offscreenWorldPtr->offscreenPtr);
  243.         DisposePtr(offscreenWorldPtr->bwBitMap);
  244.     }
  245. }
  246.  
  247. MyOffscreenComboPtr DisposeOffscreenCombo(MyOffscreenComboPtr offscreenComboPtr)
  248. {
  249.     DisposeOffscreenWorld(&(offscreenComboPtr->offscreenWorldRec));
  250.     DisposeOffscreenWorld(&(offscreenComboPtr->patternWorldRec));
  251.     DisposeOffscreenWorld(&(offscreenComboPtr->scratchWorldRec));
  252.     DisposePtr((Ptr)offscreenComboPtr);
  253.     
  254.     return 0L;
  255. }
  256.